home *** CD-ROM | disk | FTP | other *** search
Text File | 1986-08-10 | 2.9 KB | 62 lines | [TEXT/EDIT] |
- ; MATCH from _LISP_, Winston & Horn, Chapter 17
- ; the 'restriction' feature is not implemented because I haven't figured
- ; out how to implement FUNCALL in MacScheme yet
- ; Greg Grubbs, Aug. 86 GEnie: G.GRUBBS
- (define (match p d assignments)
- (cond ((and (null? p) (null? d)) ; end o' line->succeed
- (cond ((null? assignments) t)
- (else assignments)))
- ((or (null? p) (null? d)) nil) ; fail
- ((or (equal? (car p) '?) ; match ? pattern
- (equal? (car p) (car d))) ; elements are identical
- (match (cdr p) (cdr d) assignments))
- ((equal? (car p) '+) ; MATCH + pattern
- (or (match (cdr p) (cdr d) assignments)
- (match p (cdr d) assignments)))
- ((atom? (car p)) nil) ; losing atom
- ((equal? (pattern-indicator (car p)) '>) ; MATCH > variable
- (match (cdr p) (cdr d)
- (shove-gr (pattern-variable (car p))
- (car d)
- assignments)))
- ((equal? (pattern-indicator (car p)) '<) ; SUBSTITUTE variable
- (match (cons (pull-value (pattern-variable (car p)) assignments)
- (cdr p))
- d
- assignments))
- ((equal? (pattern-indicator (car p)) '+) ; MATCH + variable
- (let ((new-assignments (shove-pl (pattern-variable (car p))
- (car d)
- assignments)))
- (or (match (cdr p) (cdr d) new-assignments)
- (match p (cdr d) new-assignments))))
- ;((and (equal? (pattern-indicator (car p)) ; MATCH ? restrictions
- ; 'restrict)
- ; (equal? (restriction-indicator (car p)) '?)
- ; (test (restriction-predicates (car p)) (car d)))
- ; (match (cdr p) (cdr d) assignments))
- ))
-
- (define (shove-gr variable item a-list)
- (append a-list (list (list variable item))))
- (define (pattern-indicator l)
- (car l))
- (define (pattern-variable l)
- (cadr l))
- (define (pull-value variable a-list)
- (cond ((null? a-list) nil)
- (else (cadr (assoc variable a-list)))))
- (define (shove-pl variable item a-list)
- (cond ((null? a-list) (list (list variable (list item))))
- ((equal? variable (caar a-list))
- (cons (list variable (append (cadar a-list) (list item)))
- (cdr a-list)))
- (else (cons (car a-list)
- (shove-pl variable item (cdr a-list))))))
- ; (define (restriction-indicator pattern-item) (cadr pattern-item))
- ; (define (restriction-predicates pattern-item) (cddr pattern-item))
- ; (define (test predicates argument)
- ; (cond ((null? predicates) t)
- ; ((FUNCALL (car predicates) argument)
- ; (test (cdr predicates) argument))
- ; (else nil)))